chartView.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. 'use client'
  2. import React, { useState } from 'react'
  3. import dayjs from 'dayjs'
  4. import quarterOfYear from 'dayjs/plugin/quarterOfYear'
  5. import { useTranslation } from 'react-i18next'
  6. import useSWR from 'swr'
  7. import { fetchAppDetail } from '@/service/apps'
  8. import type { PeriodParams } from '@/app/components/app/overview/appChart'
  9. import { AvgResponseTime, AvgSessionInteractions, ConversationsChart, CostChart, EndUsersChart, TokenPerSecond, UserSatisfactionRate } from '@/app/components/app/overview/appChart'
  10. import type { Item } from '@/app/components/base/select'
  11. import { SimpleSelect } from '@/app/components/base/select'
  12. import { TIME_PERIOD_LIST } from '@/app/components/app/log/filter'
  13. dayjs.extend(quarterOfYear)
  14. const today = dayjs()
  15. const queryDateFormat = 'YYYY-MM-DD HH:mm'
  16. export type IChartViewProps = {
  17. appId: string
  18. }
  19. export default function ChartView({ appId }: IChartViewProps) {
  20. const detailParams = { url: '/apps', id: appId }
  21. const { data: response } = useSWR(detailParams, fetchAppDetail)
  22. const isChatApp = response?.mode === 'chat'
  23. const { t } = useTranslation()
  24. const [period, setPeriod] = useState<PeriodParams>({ name: t('appLog.filter.period.last7days'), query: { start: today.subtract(7, 'day').format(queryDateFormat), end: today.format(queryDateFormat) } })
  25. const onSelect = (item: Item) => {
  26. setPeriod({ name: item.name, query: item.value === 'all' ? undefined : { start: today.subtract(item.value as number, 'day').format(queryDateFormat), end: today.format(queryDateFormat) } })
  27. }
  28. if (!response)
  29. return null
  30. return (
  31. <div>
  32. <div className='flex flex-row items-center mt-8 mb-4 text-gray-900 text-base'>
  33. <span className='mr-3'>{t('appOverview.analysis.title')}</span>
  34. <SimpleSelect
  35. items={TIME_PERIOD_LIST.map(item => ({ value: item.value, name: t(`appLog.filter.period.${item.name}`) }))}
  36. className='mt-0 !w-40'
  37. onSelect={onSelect}
  38. defaultValue={7}
  39. />
  40. </div>
  41. <div className='flex flex-row w-full mb-6'>
  42. <div className='flex-1 mr-3'>
  43. <ConversationsChart period={period} id={appId} />
  44. </div>
  45. <div className='flex-1 ml-3'>
  46. <EndUsersChart period={period} id={appId} />
  47. </div>
  48. </div>
  49. <div className='flex flex-row w-full mb-6'>
  50. <div className='flex-1 mr-3'>
  51. {isChatApp
  52. ? (
  53. <AvgSessionInteractions period={period} id={appId} />
  54. )
  55. : (
  56. <AvgResponseTime period={period} id={appId} />
  57. )}
  58. </div>
  59. <div className='flex-1 ml-3'>
  60. <TokenPerSecond period={period} id={appId} />
  61. </div>
  62. </div>
  63. <div className='flex flex-row w-full mb-6'>
  64. <div className='flex-1 ml-3'>
  65. <UserSatisfactionRate period={period} id={appId} />
  66. </div>
  67. <div className='flex-1 ml-3'>
  68. <CostChart period={period} id={appId} />
  69. </div>
  70. </div>
  71. </div>
  72. )
  73. }